import fs from "node:fs"
import { defineConfig, loadEnv } from "vite"
import vue from "@vitejs/plugin-vue"
import electron from "vite-plugin-electron/simple"
import pkg from "./package.json"
import AutoImport from "unplugin-auto-import/vite"
import Components from "unplugin-vue-components/vite"
import { ElementPlusResolver } from "unplugin-vue-components/resolvers"
// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  const env = loadEnv(mode, process.cwd())
  fs.rmSync("dist-electron", { recursive: true, force: true })

  const isServe = command === "serve"
  const isBuild = command === "build"
  const sourcemap = isServe || !!process.env.VSCODE_DEBUG

  return {
    base: "./",
    plugins: [
      vue(),
      electron({
        main: {
          // Shortcut of `build.lib.entry`
          entry: "electron/main/index.ts",
          onstart({ startup }) {
            if (process.env.VSCODE_DEBUG) {
              console.log(/* For `.vscode/.debug.script.mjs` */ "[startup] Electron App")
            } else {
              startup()
            }
          },
          vite: {
            build: {
              sourcemap,
              minify: isBuild,
              outDir: "dist-electron/main",
              rollupOptions: {
                // Some third-party Node.js libraries may not be built correctly by Vite, especially `C/C++` addons,
                // we can use `external` to exclude them to ensure they work correctly.
                // Others need to put them in `dependencies` to ensure they are collected into `app.asar` after the app is built.
                // Of course, this is not absolute, just this way is relatively simple. :)
                external: Object.keys("dependencies" in pkg ? pkg.dependencies : {}),
              },
            },
            define: {
              "process.env.VITE_TENANT_ENABLE": JSON.stringify(env.VITE_TENANT_ENABLE || "false"),
            },
          },
        },
        preload: {
          // Shortcut of `build.rollupOptions.input`.
          // Preload scripts may contain Web assets, so use the `build.rollupOptions.input` instead `build.lib.entry`.
          input: "electron/preload/index.ts",
          vite: {
            build: {
              sourcemap: sourcemap ? "inline" : undefined, // #332
              minify: isBuild,
              outDir: "dist-electron/preload",
              rollupOptions: {
                external: Object.keys("dependencies" in pkg ? pkg.dependencies : {}),
              },
            },
            define: {
              "process.env.VITE_TENANT_ENABLE": JSON.stringify(env.VITE_TENANT_ENABLE || "false"),
            },
          },
        },
        // Ployfill the Electron and Node.js API for Renderer process.
        // If you want use Node.js in Renderer process, the `nodeIntegration` needs to be enabled in the Main process.
        // See 👉 https://github.com/electron-vite/vite-plugin-electron-renderer
        renderer: {},
      }),
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
      Components({
        resolvers: [ElementPlusResolver()],
      }),
    ],
    define: {
      // 传给 renderer 和 preload 用
      __APP_ENV__: JSON.stringify(env.VITE_APP_ENV),
      "import.meta.env.VITE_TENANT_ENABLE": JSON.stringify(env.VITE_TENANT_ENABLE || "false"),
    },
    server: {
      ...(process.env.VSCODE_DEBUG &&
        (() => {
          const url = new URL(pkg.debug.env.VITE_DEV_SERVER_URL)
          return {
            host: url.hostname,
            port: +url.port,
          }
        })()),
      proxy: {
        // 添加代理配置
        "/admin-api": {
          target: "http://35.95.209.213:8563",
          changeOrigin: true,
          secure: false,
          rewrite: (path) => path.replace(/^\/admin-api/, ''),
          headers: {
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Headers": "X-Requested-With, Content-Type, Authorization, tenant-id",
          },
          configure: (proxy, _options) => {
            proxy.on("proxyReq", (proxyReq, req, res) => {
              // 保留原始请求头
              const originalHeaders = req.headers
              if (originalHeaders["tenant-id"]) {
                proxyReq.setHeader("tenant-id", originalHeaders["tenant-id"])
              }
            })
            proxy.on("proxyRes", (proxyRes, req, res) => {
              // 确保 CORS 头部被添加到响应中
              res.setHeader("Access-Control-Allow-Origin", "*")
              res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
              res.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Authorization, tenant-id")
            })
          },
        }
      },
    },
    clearScreen: false,
  }
})

